package managerBeanImpl;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

import javax.annotation.security.RolesAllowed;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import managerBean.ElementoManagerBean;
import model.Elemento;
import model.Escursione;
import model.Hotel;
import model.Volo;

@Stateless
public class ElementoManagerBeanImpl implements ElementoManagerBean {

	@PersistenceContext
    private EntityManager em;
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List visualizzaVoliMgr() {
		Query query=em.createQuery("SELECT v FROM Volo v");
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List visualizzaHotelMgr() {
		Query query=em.createQuery("SELECT h FROM Hotel h");
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List visualizzaEscursioniMgr() {
		Query query=em.createQuery("SELECT e FROM Escursione e");
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List cercaVoliMgr(String cerca) {
		Query query=em.createQuery("SELECT v FROM Volo v WHERE v.luogoPartenza='"+cerca+"'");
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List cercaHotelMgr(String cerca) {
		Query query=em.createQuery("SELECT h FROM Hotel h WHERE h.nome='"+cerca+"'");
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public List cercaEscursioniMgr(String cerca) {
		Query query=em.createQuery("SELECT e FROM Escursione e WHERE e.indirizzo='"+cerca+"'");
		return query.getResultList();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void rimuoviHotelMgr(int idHotel) {
		Query query=em.createQuery("DELETE FROM Hotel h WHERE h.id="+idHotel);
		query.executeUpdate();
		Query query1=em.createQuery("SELECT e FROM Elemento e WHERE e.tipo='HOTEL' and e.idElementoSpecifico="+idHotel);
		List<Elemento> elementi =query1.getResultList();
		int idElemento=elementi.get(0).getIdElemento();
		Query query2=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idElemento="+idElemento);
		query2.executeUpdate();
		Query query3=em.createQuery("DELETE FROM Elemento e WHERE e.tipo='HOTEL' and e.idElementoSpecifico="+idHotel);
		query3.executeUpdate();
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void rimuoviVoloMgr(int idVolo) {
		Query query=em.createQuery("DELETE FROM Volo v WHERE v.id="+idVolo);
		query.executeUpdate();
		Query query1=em.createQuery("SELECT e FROM Elemento e WHERE e.tipo='VOLO' and e.idElementoSpecifico="+idVolo);
		List<Elemento> elementi =query1.getResultList();
		int idElemento=elementi.get(0).getIdElemento();
		Query query2=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idElemento="+idElemento);
		query2.executeUpdate();
		Query query3=em.createQuery("DELETE FROM Elemento e WHERE e.tipo='VOLO' and e.idElementoSpecifico="+idVolo);
		query3.executeUpdate();
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void rimuoviEscursioneMgr(int idEscursione) {
		Query query=em.createQuery("DELETE FROM Escursione e WHERE e.id="+idEscursione);
		query.executeUpdate();
		Query query1=em.createQuery("SELECT e FROM Elemento e WHERE e.tipo='ESCURSIONE' and e.idElementoSpecifico="+idEscursione);
		List<Elemento> elementi =query1.getResultList();
		int idElemento=elementi.get(0).getIdElemento();
		Query query2=em.createQuery("DELETE FROM ComponentiPacchetti c WHERE c.id.idElemento="+idElemento);
		query2.executeUpdate();
		Query query3=em.createQuery("DELETE FROM Elemento e WHERE e.tipo='ESCURSIONE' and e.idElementoSpecifico="+idEscursione);
		query3.executeUpdate();
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void updateVoloMgr(int id, Date data,String luogoPartenza,String luogoDestinazione, int numeroPosti, String descrizione,int prezzo) throws ParseException {
		Volo volo=new Volo(id,data,luogoPartenza,luogoDestinazione,numeroPosti,descrizione,prezzo);
		Query query=em.createQuery("DELETE FROM Volo v WHERE v.id="+id);
		query.executeUpdate();
		em.persist(volo);
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void updateHotelMgr(int id, Date data,String nome, String indirizzo,
			int numeroPosti, String descrizione,int prezzo)
			throws ParseException {
		Hotel hotel=new Hotel(id, data, descrizione, indirizzo, nome, numeroPosti,prezzo);
		Query query=em.createQuery("DELETE FROM Hotel h WHERE h.id="+id);
		query.executeUpdate();
		em.persist(hotel);
		
	}

	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void updateEscursioneMgr(int id, Date data, String indirizzo,
			int numeroPosti, String descrizione,int prezzo) throws ParseException {
		Escursione escursione=new Escursione(id, data, descrizione, indirizzo, numeroPosti,prezzo);
		Query query=em.createQuery("DELETE FROM Escursione e WHERE e.id="+id);
		query.executeUpdate();
		em.persist(escursione);
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void creaVoloMgr(Date data,String luogoPartenza,String luogoDestinazione, int numeroPosti, String descrizione,int prezzo) throws ParseException {
		Query query=em.createQuery("SELECT e FROM Elemento e WHERE e.idElemento=(SELECT max(e1.idElemento) FROM Elemento e1)");
		List<Elemento> elementi=query.getResultList();
		int idElemento;
		if(elementi.isEmpty())
			idElemento=1;
		else
			idElemento=elementi.get(0).getIdElemento()+1;
		Query query2=em.createQuery("SELECT v FROM Volo v WHERE v.id=(SELECT max(v1.id) FROM Volo v1)");
		List<Volo> voli=query2.getResultList();
		int idVolo;
		if(voli.isEmpty())
			idVolo=1;
		else
			idVolo=voli.get(0).getId()+1;		
		Volo volo=new Volo(idVolo,data,luogoPartenza,luogoDestinazione,numeroPosti,descrizione,prezzo);
		Elemento elemento= new Elemento(idElemento, idVolo, "VOLO");		
		em.persist(volo);
		em.persist(elemento);
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void creaHotelMgr(Date data,String nome, String indirizzo,
			int numeroPosti, String descrizione,int prezzo)
			throws ParseException {
		Query query=em.createQuery("SELECT e FROM Elemento e WHERE e.idElemento=(SELECT max(e1.idElemento) FROM Elemento e1)");
		List<Elemento> elementi=query.getResultList();
		int idElemento;
		if(elementi.isEmpty())
			idElemento=1;
		else
			idElemento=elementi.get(0).getIdElemento()+1;
		Query query2=em.createQuery("SELECT h FROM Hotel h WHERE h.id=(SELECT max(h1.id) FROM Hotel h1)");
		List<Hotel> hotels=query2.getResultList();
		int idHotel;
		if(hotels.isEmpty())
			idHotel=1;
		else
			idHotel=hotels.get(0).getId()+1;				
		Hotel hotel=new Hotel(idHotel, data, descrizione, indirizzo, nome, numeroPosti,prezzo);
		Elemento elemento= new Elemento(idElemento, idHotel, "HOTEL");
		em.persist(hotel);
		em.persist(elemento);		
	}
	
	@Override
	@RolesAllowed({"IMPIEGATO"})
	public void creaEscursioneMgr(Date data, String indirizzo,
			int numeroPosti, String descrizione,int prezzo) throws ParseException {
		Query query=em.createQuery("SELECT e FROM Elemento e WHERE e.idElemento=(SELECT max(e1.idElemento) FROM Elemento e1)");
		List<Elemento> elementi=query.getResultList();
		int idElemento;
		if(elementi.isEmpty())
			idElemento=1;
		else
			idElemento=elementi.get(0).getIdElemento()+1;
		Query query2=em.createQuery("SELECT e FROM Escursione e WHERE e.id=(SELECT max(e1.id) FROM Escursione e1)");
		List<Escursione> escursioni=query2.getResultList();
		int idEscursione;
		if(escursioni.isEmpty())
			idEscursione=1;
		else
			idEscursione=escursioni.get(0).getId()+1;
		Escursione escursione=new Escursione(idEscursione, data, descrizione, indirizzo, numeroPosti,prezzo);
		Elemento elemento= new Elemento(idElemento, idEscursione, "ESCURSIONE");
		em.persist(escursione);
		em.persist(elemento);
	}

}
